package com.nbcio.cd.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.nbcio.cd.domain.CdFolder;
import com.nbcio.cd.domain.vo.CdFolderVo;
import com.nbcio.common.core.domain.R;

import java.util.List;

/**
 * 云网盘文件夹Service接口
 *
 * @author nbacheng
 */
public interface ICdFolderService extends IService<CdFolder> {

    /**
     * 创建文件夹
     *
     * @param folderName 文件夹名称
     * @param parentId 父文件夹ID
     * @param projectId 项目ID（可选）
     * @return 文件夹信息
     */
    CdFolderVo createFolder(String folderName, Long parentId, Long projectId);

    /**
     * 重命名文件夹
     *
     * @param folderId 文件夹ID
     * @param newName 新名称
     * @return 操作结果
     */
    Boolean renameFolder(Long folderId, String newName);

    /**
     * 移动文件夹
     *
     * @param folderId 文件夹ID
     * @param targetParentId 目标父文件夹ID
     * @return 操作结果
     */
    Boolean moveFolder(Long folderId, Long targetParentId);

    /**
     * 复制文件夹
     *
     * @param folderId 文件夹ID
     * @param targetParentId 目标父文件夹ID
     * @return 操作结果
     */
    Boolean copyFolder(Long folderId, Long targetParentId);

    /**
     * 删除文件夹
     *
     * @param folderIds 文件夹ID列表
     * @return 操作结果
     */
    Boolean deleteFolders(List<Long> folderIds);

    /**
     * 获取文件夹树
     *
     * @param userId 用户ID
     * @param projectId 项目ID（可选）
     * @return 文件夹树
     */
    List<CdFolderVo> getFolderTree(Long userId, Long projectId);

    /**
     * 查询文件夹列表
     *
     * @param parentId 父文件夹ID
     * @param folderName 文件夹名称（可选）
     * @param folderType 文件夹类型（可选）
     * @param pageQuery 分页查询
     * @return 文件夹列表
     */
    R<List<CdFolderVo>> queryFolderList(Long parentId, String folderName, String folderType, CdFolderVo pageQuery);

    /**
     * 获取文件夹详情
     *
     * @param folderId 文件夹ID
     * @return 文件夹详情
     */
    CdFolderVo getFolderInfo(Long folderId);

    /**
     * 检查文件夹权限
     *
     * @param folderId 文件夹ID
     * @param permissionType 权限类型
     * @return 是否有权限
     */
    Boolean checkFolderPermission(Long folderId, String permissionType);

    /**
     * 更新文件夹统计信息
     *
     * @param folderId 文件夹ID
     */
    void updateFolderStats(Long folderId);

    /**
     * 获取用户根文件夹
     *
     * @param userId 用户ID
     * @return 根文件夹
     */
    CdFolder getUserRootFolder(Long userId);

    /**
     * 获取项目根文件夹
     *
     * @param projectId 项目ID
     * @return 项目根文件夹
     */
    CdFolder getProjectRootFolder(Long projectId);

    /**
     * 根据ID删除文件夹（递归删除）
     *
     * @param folderId 文件夹ID
     * @return 删除结果
     */
    Boolean deleteByFolderId(Long folderId);
}
